// emitter.ts

/**
 * 回调函数类型：接收一个可选参数，返回任意值
 */
type ICallback = (arg?: unknown) => unknown;
/**
 * 回调函数数组类型
 */
type ICallbacks = ICallback[];

/**
 * 事件容器接口：键为事件名，值为回调函数数组
 */
interface IEvents {
  [key: string]: ICallbacks;
}


function createEmitter() {
  /**
   * 存储自定义事件的容器
   * 容器结构：
   * {
   *   事件名称: [回调函数1, 回调函数2, ...]
   * }
   */
  const events: IEvents = {};


  return {
    // 绑定自定义事件
    // eventName 自定义事件名称,caLLback 自定义事件回调函数
    on(eventName: string, callback: ICallback) {
      if (events[eventName]) {
        events[eventName].push(callback);
      }
      events[eventName] = [callback];
    },
    // 解绑自定义事件
    off(eventName?: string, callback?: ICallback) {
      /*
        off（eventName）解绑该事件（eventName）的所有回调函数
        off（eventName，cb）解绑该事件（eventName）的一个回调函数（cb）
       */
      const callbacks = events[eventName];
      if (!callbacks) {
        // return;
        throw new Error(`${eventName} 自定义事件不存在~`);
      }
      if (callbacks) {
        // 解绑指定回调函数
        // 比较函数是否相同，比较的是地址值
        events[eventName] = callbacks.filter(cb => cb !== callback)
      } else {
        // 解绑所有事件
        delete events[eventName];
      }

    },
    // 触发自定义事件
    // eventNamee自定义事件名称,arg自定义事件回调函数的参数
    emit(eventName: string, arg?: unknown) {
      const callbacks = events[eventName];
      if (!callbacks) {
        // return;
        throw new Error(`${eventName} 自定义事件不存在~`);
      }
      // 遍历执行回调函数
      callbacks.forEach(cb => cb(arg));
    },
  };
}

// 创建全局唯一的事件总线实例
const globalEmitter = createEmitter();

// 导出默认值，供其他模块使用
export default globalEmitter;
